package com.hospital.hospitalserver.mapper;

import com.hospital.hospitalserver.entity.PaymentItemDTO;
import com.hospital.hospitalserver.entity.PaymentRecordDTO;
import com.hospital.hospitalserver.entity.Vo.PaymentItemVO;
import com.hospital.hospitalserver.entity.Vo.PaymentVO;
import com.hospital.hospitalserver.entity.query.PaymentQuery;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;

/**
 * 收费信息相关接口方法
 * */
@Mapper
public interface PaymentMapper {

    /**
     * 管理端查询收费分页信息总行数
     */
    Integer getPaymentMapperDataCountsBySearch(PaymentQuery query);

    /**
     * 管理端查询收费分页信息
     */
    List<PaymentVO> getPaymentMapperDataBySearch(PaymentQuery query);

    /**
     * 根据收费ID查询收费项目明细
     */
    List<PaymentItemVO> getPaymentItemsByPaymentId(@Param("paymentId") Integer paymentId);

    /**
     * 插入收费主表记录
     * @param paymentRecord 收费记录
     * @return 插入条数
     */
    int insertPaymentRecord(PaymentRecordDTO paymentRecord);

    /**
     * 插入收费项目明细
     * @param paymentItems 收费项目列表
     * @return 插入条数
     */
    int insertPaymentItems(@Param("items") List<PaymentItemDTO> paymentItems);

    /**
     * 删除收费项目明细
     */
    int deletePaymentItemByFeeItemId(@Param("paymentId") Integer paymentId, @Param("feeItemId") Integer feeItemId);

    /**
     * 删除收费记录
     */
    int deletePaymentRecord(@Param("paymentId") Integer paymentId);

    /**
     * 更新收费记录金额
     */
    int updatePaymentAmount(@Param("paymentId") Integer paymentId, @Param("newAmount") BigDecimal newAmount);

    /**
     * 更新收费记录金额和医保信息
     */
    int updatePaymentAmountAndInsurance(@Param("paymentId") Integer paymentId,
                                        @Param("newAmount") BigDecimal newAmount,
                                        @Param("insuranceCardNumber") String insuranceCardNumber,
                                        @Param("reimbursementRate") String reimbursementRate,
                                        @Param("insurancePayment") BigDecimal insurancePayment,
                                        @Param("personalPayment") BigDecimal personalPayment);

    /**
     * =============== 自助缴费功能3 ===============
     * */
    /**
     * 查询当前缴费信息是否存在
     * */
    PaymentVO getPaymentMainByPaymentId(@Param("paymentId") Integer paymentId);

    /**
     * 更新支付项目凭证编码
     * 根据paymentId查询支付项目列表
     */
    List<PaymentItemVO> selectPaymentItemsByPaymentId(@Param("paymentId") Integer paymentId);

    /**
     * 更新医保支付和个人支付金额，以及收费状态
     */
    Integer updatePaymentAmountAndStatus(@Param("paymentId") Integer paymentId,
                                     @Param("insurancePayment") BigDecimal insurancePayment,
                                     @Param("personalPayment") BigDecimal personalPayment,
                                     @Param("paymentStatus") String paymentStatus,
                                     @Param("paymentTime") LocalDateTime paymentTime,
                                     @Param("paymentMethod") String paymentMethod);

    /**
     * 更新支付项目凭证编码
     */
    Integer updatePaymentItemVoucher(@Param("itemId") Integer itemId,
                                 @Param("voucherNo") String voucherNo);
}
